[libcxx] LWG2485: get() should be overloaded for const tuple&&. Patch from K-Ballo. Review: http://reviews.llvm.org/D14839 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@255941 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/tuple b/include/tuple index 837be6f..cb1e27d 100644 --- a/include/tuple +++ b/include/tuple 
@@ -95,6 +95,9 @@  template <size_t I, class... T>  typename tuple_element<I, tuple<T...>>::type&&  get(tuple<T...>&&) noexcept; // constexpr in C++14 +template <size_t I, class... T> + const typename tuple_element<I, tuple<T...>>::type&& + get(const tuple<T...>&&) noexcept; // constexpr in C++14    template <class T1, class... T>  constexpr T1& get(tuple<T...>&) noexcept; // C++14 @@ -102,6 +105,8 @@  constexpr const T1& get(const tuple<T...>&) noexcept; // C++14  template <class T1, class... T>  constexpr T1&& get(tuple<T...>&&) noexcept; // C++14 +template <class T1, class... T> + constexpr const T1&& get(const tuple<T...>&&) noexcept; // C++14    // 20.4.1.6, relational operators:  template<class... T, class... U> bool operator==(const tuple<T...>&, const tuple<U...>&); // constexpr in C++14 @@ -507,6 +512,8 @@  const typename tuple_element<_Jp, tuple<_Up...> >::type& get(const tuple<_Up...>&) _NOEXCEPT;  template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11  typename tuple_element<_Jp, tuple<_Up...> >::type&& get(tuple<_Up...>&&) _NOEXCEPT; + template <size_t _Jp, class ..._Up> friend _LIBCPP_CONSTEXPR_AFTER_CXX11 + const typename tuple_element<_Jp, tuple<_Up...> >::type&& get(const tuple<_Up...>&&) _NOEXCEPT;  public:    template <bool _Dummy = true, class = typename enable_if< @@ -766,6 +773,16 @@  static_cast<__tuple_leaf<_Ip, type>&&>(__t.base_).get());  }   +template <size_t _Ip, class ..._Tp> +inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 +const typename tuple_element<_Ip, tuple<_Tp...> >::type&& +get(const tuple<_Tp...>&& __t) _NOEXCEPT +{ + typedef typename tuple_element<_Ip, tuple<_Tp...> >::type type; + return static_cast<const type&&>( + static_cast<const __tuple_leaf<_Ip, type>&&>(__t.base_).get()); +} +  #if _LIBCPP_STD_VER > 11  // get by type  template <typename _T1, size_t _Idx, typename... _Args> @@ -822,6 +839,13 @@  return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup));  }   +template <class _T1, class... _Args> +inline _LIBCPP_INLINE_VISIBILITY +constexpr _T1 const&& get(tuple<_Args...> const&& __tup) noexcept +{ + return _VSTD::get<__find_exactly_one_t<_T1, _Args...>::value>(_VSTD::move(__tup)); +} +  #endif    // tie